package com.kevinkk.dp;

import java.util.List;

/**
 * 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。
 *
 * 注意：不要求字典中出现的单词全部都使用，并且字典中的单词可以重复使用。
 */

/**
 * 完全背包、求能否拼成、求排列数
 * 因此外层循环是背包的空间，内层循环是商品
 */
public class WordBreak {
    class Solution {
        public boolean wordBreak(String s, List<String> wordDict) {
            char[] c = s.toCharArray();
            boolean[] dp = new boolean[c.length + 1];
            dp[0] = true;
            for (int i = 1; i <= c.length; i++) {
                for (String word : wordDict) {
                    int len = word.length();
                    // 首先 背包的大小要能装进该商品（单词）
                    // 并且 装入装入该单词之前前面的子串要能被拼成
                    if (i >= len && dp[i - len]) {
                        if (s.substring(i - len, i).equals(word))
                            dp[i] = true;
                    }
                }
            }
            return dp[c.length];
        }
    }
}
